var sitePlayer = function(url) {
    // Громкость плеера
    this.volume = 100;
    // Здесь будут хранится идентификаторы уже загруженных треков
    this.loadedIDs = [];
    this.isPlayedFlag = false;
    this.playingTrackId = null;
    this.playingTrackObj = null;
    // Максимальное количество загруженных треков (рекумендуется выбирать
    // оптимальное значение, для сохранения памяти на стороне клиента)
    this.maxLoaded = 10;
    
    soundManager.url = url;
    soundManager.flashVersion = 9; 
    soundManager.useFlashBlock = false;
    soundManager.useHTML5Audio = true;
    soundManager.flash9Options = {
        useWaveformData: true
    }

    this.load = function(id, fileUrl, wpCallback, ofCallback) {
        var fileID = id.toString();
        var loadedTracksCount = this.loadedIDs.length;
        if (loadedTracksCount > this.maxLoaded) {
            soundManager.destroySound(this.loadedIDs[0]);
            this.loadedIDs.shift();
        }
        var track = soundManager.createSound({
            id: fileID,
            url: fileUrl,
            volume: this.getVolume(),
            whileplaying: wpCallback,
            onfinish: ofCallback
        });
        this.currentTrack = fileID;
        this.playingTrackObj = track;
        // Если данный трек ещё не был загружен
        if ($.inArray(fileID, this.loadedIDs) == -1) {
            this.loadedIDs.push(fileID);
        }
        return this.playingTrackObj;
    }

    /**
     * player.play() - Функция воспроизводит указанный трек
     *   id - идентификатор воспроизводимого трека
     *   fileUrl - URL воспроизводимого трека
     *   wpCallback - callback функция, выполняется во время воспроизведения трека
     */
    this.play = function() {
        if (this.isPlayed() == false) {
            this.track().play();
            this.isPlayedFlag = true;
        }
    }
    
    /**
     * player.pause() - Функция приостанавливает воспроизведение текущего трека
     */
    this.pause = function() {
        if (this.isPlayed() == true) {
            this.track().pause();
            this.isPlayedFlag = false;
        }
    }
    
    /**
     * Функция останавливает вопросизведение текущего трека
     */
    this.stop = function() {
        if (this.isPlayed() == true) {
            this.track().stop();
            this.track().setPosition(0);
            this.isPlayedFlag = false;
        }
    }
    
    this.isPlayed = function() {
        return this.isPlayedFlag;
    }
    
    this.getPlayingTrackId = function() {
        if (this.isPlayed() == true) {
            return this.playingTrackId;
        } else {
            return null;
        }
    }
    
    /**
     * player.track() - возвращает объект текущего воспроизводимого трек;
     *   если трек не воспроизводится возвращается null
     */
    this.track = function() {
        return this.playingTrackObj;
    }
    
    /**
     * player.setVolume(volume) - устанавилвает громкость плеера
     */
    this.setVolume = function(volume) {
        // Устанавливаем громкость для всех последующих треков
        this.volume = volume;
        // Устанавливаем громкость для уже загруженных треков
        for (var track in this.loadedIDs) {
            soundManager.setVolume(this.loadedTracks[track], volume);
        }
    }
    
    /**
     * player.getVolume() - возвращает текущую громкость плеера
     */
    this.getVolume = function() {
        return this.volume;
    }
    
}

var waveformObj = function(container, count) {
    this.container = container;
    this.count = count;
    this.barWidth = 20;
    this.maxBarHeight = 100;
    
    this.create = function() {
        $(this.container).css({
            'width': this.count * this.barWidth + 'px',
            'height': this.maxBarHeight
        });
        for (i=0; i<this.count; i++) {
            var bgColor = 'rgb(' + i + ', 0, 0)';
            $('<div>', {
                css: {
                    'background-color': bgColor,
                    'width': this.barWidth
                } 
            }).appendTo(this.container);
        }
    }

    this.draw = function(source) {
        var multiplier = Math.floor(256 / this.count);
        for (i=0; i<this.count; i++) {
            // Выбирает нужный DIV по номеру итерации
            var e = $(container).find('div:eq(' + i + ')');
            // Присвиваем ему неободимую высоту
            var mid = (parseFloat(source[i*multiplier]) + 1) / 2;
            var height = Math.floor(mid * this.maxBarHeight);
            // Устанавливаем CSS свойство, указывающее высоту объекта
            e.css('height', Math.ceil(height).toString() + 'px');
        }
    }
    
    this.setBarWidth = function(width) {
        this.barWidth = width;
    }
    
    this.setMaxBarHeight = function(height) {
        this.maxBarHeight = height;
    }
    
}

$().ready(function($) {

    // Создаём новую коппию объекта "плеер"
    var player = new sitePlayer(window.site + '/webroot/flash/');
    var waveform = new waveformObj('#waveform', 255);
    waveform.setBarWidth(4);
    waveform.setMaxBarHeight(500);
    waveform.create();
    
    // Данные действия будут выполнены при выборе трека
    $('.track').click(function() {
        // ID выбранного трека
        var id = $(this).prev('.track-id').text();
        // URL по которому будет загружаться поток
        var url = window.site + '/?c=index&m=play&id=' + id;
        // Если плеер воспроизводит другой трек останаливает его
        if (player.isPlayed() == true) {
            player.stop();
        }
        // Глузим в буфер новый трек
        player.load(id, url, /* whilePlaying callback */function() {
            waveform.draw(this.waveformData.left);
            var completed = player.track().position / player.track().duration;
            var loaded = player.track().bytesLoaded / player.track().bytesTotal;
            // Рисуем прогресс загруженности трека
            $('#progress-bar-completed').css('width', Math.floor(completed * 400));
            // Рисуем прогресс загрузки трека
            $('#progress-bar-loaded').css('width', Math.floor(loaded * 400));
            
        });
        player.play();
        // Выделяем воспроизводимый трек
        $('.track').css('font-weight', 'normal');
        $(this).css('font-weight', 'bold');
    });
    
    $('#player-button-play').click(function() {
        player.play();
    });
    
    $('#player-button-pause').click(function() {
        player.pause();
    });
    
    $('#player-button-stop').click(function() {
        player.stop();
    });
    
    
    
    /*function rgb2hex(r, g, b) {
        return int2hex(r) + int2hex(g) + int2hex(b);
    }
    
    function int2hex(number) {
           if (number == null) {
               return '00';
           }
           number = parseInt(number);
           if (number == 0 || isNaN(number)) {
               return '00';
           }
           number = Math.max(0, number);
           number = Math.min(number, 255);
           number = Math.round(number);
           return '0123456789ABCDEF'.charAt((number - number % 16) / 16) + '0123456789ABCDEF'.charAt(number % 16);
    }

    var leftButtonDown = false;
    
    var timerId = -1;
    
    $(document).mousedown(function(e){
        if(e.which === 1) leftButtonDown = true;
    });
    
    $(document).mouseup(function(e){
        if(e.which === 1) leftButtonDown = false;
    });

    function tweakMouseMoveEvent(e){
        if ($.browser.msie && !(document.documentMode >= 9) && ! event.button) {
            leftButtonDown = false;
        }
        if(e.which === 1 && !leftButtonDown) {
            e.which = 0;
        }
    }
    

                

    
    var player = new dubzPlayer();

    $('.track').click(function() {
        clearInterval(timerId);
        $('.track').css('font-weight', 'normal');
        $(this).css('font-weight', 'bold');
        var id = $(this).prev('.track-id').text();
        soundManager.stopAll();
        player.play(id);
        $('#player-button-pause').removeAttr('disabled');
        $('#player-button-stop').removeAttr('disabled');
        enableTimer();
    });
    
    $('#player-button-play').attr('disabled', 'disabled');
    $('#player-button-pause').attr('disabled', 'disabled');
    $('#player-button-stop').attr('disabled', 'disabled');

    $('#player-button-pause').click(function() {
        $(this).attr('disabled', 'disabled');
        $('#player-button-play').removeAttr('disabled');
        $('#player-button-stop').removeAttr('disabled');
        player.pause(player.getPlayedId());
        clearInterval(timerId);
    });
    
    $('#player-button-stop').click(function() {
        $(this).attr('disabled', 'disabled');
        $('#player-button-pause').attr('disabled', 'disabled');
        $('#player-button-play').removeAttr('disabled');
        player.currentTrack().setPosition(0);
        player.stop(player.getPlayedId());
        clearInterval(timerId);
    });
    
    $('#player-button-play').click(function() {
        $(this).attr('disabled', 'disabled');
        $('#player-button-pause').removeAttr('disabled');
        $('#player-button-stop').removeAttr('disabled');
        soundManager.pauseAll();
        player.play(player.getPlayedId());
        enableTimer();
    });
    

    $("#progress-bar").click(function(e) {
        var x = e.pageX - this.offsetLeft;
        player.currentTrack().setPosition(Math.floor(player.currentTrack().duration * (x / 400)));
    });

    $("#progress-bar").mousemove(function(e) {
        var x = e.pageX - this.offsetLeft;
        tweakMouseMoveEvent(e);
        if (e.which == 1) {
            player.currentTrack().setPosition(Math.floor(player.currentTrack().duration * (x / 400)));
        }
    });
    
    $("#volume-bar").click(function(e) {
        var x = e.pageX - this.offsetLeft;
        player.setVolume(Math.floor(x));
        $('#volume-bar-current').css(
            {'width': x + 'px'}
        );
    });
        
    $("#volume-bar").mousemove(function(e) {
        var x = e.pageX - this.offsetLeft;
        tweakMouseMoveEvent(e);
        if (e.which == 1) {
            player.setVolume(Math.floor(x));
            $('#volume-bar-current').css(
                {'width': x + 'px'}
            );
        }
    });*/

    Cufon.replace('h1, h2, h3, h4, h5, h6, #menu a, #files', {
        hover: 'true'
    });
   
});